# 导入 numpy 库
import numpy as np
import cupy as cp
# 定义 k-means 类
class kmeans:
 # 初始化方法，接受聚类个数knum和数据data
    def __init__(self, knum, data):
        # 将数据转换为一维数组
        self.data = np.array(data).flatten()
        # 随机选择knum个数据点作为初始聚类中心
        self.centers = np.random.choice(self.data, knum, replace=False)
        # 初始化聚类标签和误差平方和
        self.labels = np.zeros(len(self.data), dtype=int)
        self.sse = 0
  # 聚类方法，返回聚类标签和误差平方和
    def fit(self):  
        # 计算每个数据点到各个聚类中心的距离
        distances = np.abs(self.data[:, np.newaxis] - self.centers)
        # 分配每个数据点到距离最近的聚类中心
        new_labels = np.argmin(distances, axis=1)
        # 更新聚类标签和误差平方和
        self.labels = new_labels
        # 计算每个聚类的新的中心点，即簇内数据的均值
        for i in range(len(self.centers)):
             self.centers[i] = np.mean(self.data[self.labels == i])
    def getsse(self):
         return cp.sum((self.data - self.centers[self.labels]) ** 2)
if __name__ == "__main__":
        data=np.array([1,5,4,6,9,45])
        a=kmeans(2,data)
        print(a.getsse())
        a.fit()
        print(a.getsse())
        a.fit()
        print(a.getsse())
